Последние изменения - Поиск:

edit SideBar

Go /

НемногоПроБезопасностьМассивов

В Golang любая запись в массив не является thread-safe. Есть вот это:

https://stackoverflow.com/questions/22517614/golang-concurrent-array-access

см. ответ с сомнениями - если байты упакованы в слово, то запись может записывать слово целиком, тогда пострадают соседние байты. Я сделал эксперимент:

package main

import (
 "fmt"
 "sync" )

const ArraySize = 8

var glob [ArraySize]uint8

func WriteAndRead(index int, valueToWrite uint8, avatar []uint8) {
 glob[index] = valueToWrite
 got := avatar[index];
 if got != valueToWrite {
  fmt.Printf("Wrote %d and got %d\n", valueToWrite, got) }}

func WriteAndReadManyTimes(goroutineId int, avatar []uint8) {
 times := 100000001;
 start := goroutineId * times
 index := goroutineId % ArraySize;
 for count := start; count < start + times; count++ {
  valueToWrite := uint8(count % 256)
  WriteAndRead(index, valueToWrite, avatar) }}

func main() {
 avatar := glob[:]
 var wg sync.WaitGroup
 for goroutineId := 0; goroutineId < ArraySize; goroutineId++ {
  gi := goroutineId
  wg.Add(1)
  f := func() {
   defer wg.Done()
   WriteAndReadManyTimes(gi,avatar) }
  go f() }
 wg.Wait()
 fmt.Println("Done!") }

Всё работает.

Считается, что массивы и срезы безопасны по чтению. https://groups.google.com/forum/#!topic/golang-nuts/3FVAs9dPR8k

https://grokbase.com/t/gg/golang-nuts/142s7phe65/go-nuts-are-slices-thread-safe-for-reading

Править - История - Печать - Последние изменения - Поиск
Редакция от 19.02.2019 13:54